package org.apli.haiam.admin.jsf.managed;

import com.apli.controladores.AplinfoFactoryBean;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.AdmPermiso;
import org.apli.haiam.ejb.entidades.AdmTipoConsulta;
import org.apli.haiam.ejb.entidades.AdmUsuario;
import org.apli.haiam.ejb.entidades.CexAgenda;
import org.apli.haiam.ejb.entidades.CexEspecialidad;
import org.apli.haiam.ejb.entidades.CexEspecialidadMedico;
import org.apli.haiam.ejb.entidades.CexHistoriaClinica;
import org.apli.haiam.ejb.entidades.CexHorario;
import org.apli.haiam.ejb.entidades.CexHorariosDia;
import org.apli.haiam.ejb.entidades.CexPreparacion;
import org.apli.haiam.ejb.interfaces.AdministradorHaiam;
import org.apli.haiam.ejb.interfaces.ConsExternaAdministrador;
import org.apli.jsf.managed.JsfBean;
import org.primefaces.event.RowEditEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad CexAgenda.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 20/04/2015
 */
@ManagedBean
@ViewScoped
public class JsfReagendamiento extends JsfBean<CexEspecialidadMedico> {

    final Logger log = LoggerFactory.getLogger(JsfReagendamiento.class);
    private Date fechaOrigen;
    private Date fechaDestino;
    private CexEspecialidad especialidadOrigen;
    private CexEspecialidad subEspecialidadOrigen;
    private CexEspecialidad especialidadDestino;
    private CexEspecialidad subEspecialidadDestino;
    private CexEspecialidadMedico medicoOrigen;
    private CexEspecialidadMedico medicoDestino;
    private Integer dia;
    private Calendar c1;
    private AdmTipoConsulta admTipoConsulta;
    private List<CexEspecialidad> listEspecialidad;
    private List<CexHorariosDia> listaHorarioDia;
    private List<CexAgenda> listaOrigen;
    private List<CexAgenda> listaDestino;
    private ConsExternaAdministrador hcAdmin;
    private String motivoReagendamiento;
    private CexAgenda objOrigen;
    private CexAgenda objDestino;
    private UsuarioAdmin user;
    private AdmUsuario admUsuario;
    private String textoReagendamiento;
    private int contOrigen;

    /**
     * Constructor por defecto.
     */
    public JsfReagendamiento() {
        // sistemaSeleccionado = new AdmSistema();
    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {
        //setSwGrabar(false);
        object = new CexEspecialidadMedico();
        fechaOrigen = new Date();
        fechaDestino = new Date();
        especialidadOrigen = new CexEspecialidad();
        especialidadDestino = new CexEspecialidad();
        subEspecialidadOrigen = new CexEspecialidad();
        subEspecialidadDestino = new CexEspecialidad();
        medicoOrigen = new CexEspecialidadMedico();
        medicoDestino = new CexEspecialidadMedico();
        c1 = Calendar.getInstance();
        dia = 0;
        listaHorarioDia = new ArrayList<>();
        listaOrigen = new ArrayList<>();
        listaDestino = new ArrayList<>();
        motivoReagendamiento = "";
        objOrigen = new CexAgenda();
        objDestino = new CexAgenda();
        user = (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");
        admUsuario = user.getUser();
        textoReagendamiento = "";
        contOrigen = 0;
        try {
            admTipoConsulta = (AdmTipoConsulta) adminObject.buscar(AdmTipoConsulta.class, "atcId", 1);
            listEspecialidad = adminObject.listarNullOrdenada(CexEspecialidad.class, "cexEspecialidad", "cesEstado", 1, "cesNombre", true);

        } catch (Exception e) {
            log.error("inicializar() {} ", e.getMessage());
        }

    }

    /**
     * Iyección de dependencia para conectarse al EJB(Lógica de Negocio)
     * Iyección de dependencia para el sistema de Administarción. Iyección de
     * dependencia para el sistema de Emergencia.
     */
    @Override
    protected void cargarEjb() {
        //super.cargarEjb();
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (hcAdmin == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.ConsExterna");
                ejbPath = ORBContext + ejbContextPath + "/ConsExternaAdministradorBean";
                hcAdmin = (ConsExternaAdministrador) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error("{}: {} - {} ", new Object[]{nombreMetodo, ejbPath, e});
            }

        }

        if (adminObject == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.admin");
                ejbPath = ORBContext + ejbContextPath + "/AdministradorBeanHaiam";
                adminObject = (AdministradorHaiam) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error("{}: {} - {} ", new Object[]{nombreMetodo, ejbPath, e});
            }
        }
    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    @Override
    public String grabarAction() {

        FacesContext context = FacesContext.getCurrentInstance();
        try {
            int actDes = 0;
            int actOri = 0;
            objOrigen = new CexAgenda();
            objDestino = new CexAgenda();
            String valorDocumento;
            int estado = 0;
            CexPreparacion cexPreparacion = new CexPreparacion();
            CexHistoriaClinica cexHistoriaClinica = new CexHistoriaClinica();
            //Verificar si la esta seleccionado un solo turno de la lista origen
            for (CexAgenda objAgeOrigen : listaOrigen) {
                if (objAgeOrigen.isSeleccionado()) {
                    actOri = actOri + 1;
                    objOrigen = objAgeOrigen;
                }
            }

            if (actOri == 0) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Seleccione turno origen", "Seleccione turno origen"));
                return null;

            }

            if (actOri > 1) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Solo debe seleccionar un turno origen", "Solo debe seleccionar un turno origen"));
                return null;

            }

            //Verificar si la esta seleccionado un solo turno de la lista destino
            for (CexAgenda objAgeDestino : listaDestino) {
                if (objAgeDestino.isSeleccionado()) {
                    actDes = actDes + 1;
                    objDestino = objAgeDestino;
                }
            }

            if (actDes == 0) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Seleccione turno destino", "Seleccione turno destino"));
                return null;

            }

            if (actDes > 1) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Solo debe seleccionar un turno destino", "Solo debe seleccionar un turno destino"));
                return null;

            }

            //validad que el turno origen no sea vacio ni culminada la atención
            if (objOrigen.getCagEstado() == 0 || objOrigen.getCagEstado() == 3) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se puede reagendar turno origen libre o turno origen con consulta culminada", "No se puede reagendar turno origen libre o turno origen con consulta culminada"));
                return null;
            }

            //validad que el turno destino este sin asignar paciente
            if (objDestino.getCagEstado() == 1 || objDestino.getCagEstado() == 2 || objDestino.getCagEstado() == 3) {
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Solo es posible reagendar a turno destino libre", "Solo es posible reagendar a turno destino libre"));
                return null;
            }

            //Modificar turno origen
            //Verificar si las agendas estan bloqueadas para mantener el objeto origen en caso que no este bloqueda la agenda se elimina la agenda
            if (contOrigen == 1) {
                estado = objOrigen.getCagEstado();
                objOrigen.setCagEstadoReagendado(2);
                objOrigen.setCagObservacion(motivoReagendamiento);
                hcAdmin.reagendarTurno(objOrigen, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                //Recuperar la preparacion en el caso de que ya teng preparacion
                if (objOrigen.getCexPreparacionList().size() == 1) {
                    cexPreparacion = objOrigen.getCexPreparacionList().get(0);
                    cexPreparacion.setCprObservaciones(cexPreparacion.getCprObservaciones().concat(" ").concat("TURNO REAGENDADO"));
                } else if (objOrigen.getCexPreparacionList().size() > 1) {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Turno tiene mas de una preparacion no es posible duplicar preparacion", "Turno tiene mas de una preparacion no es posible duplicar preparacion"));
                }
            } else {
                if (objOrigen.getCexPreparacionList().size() == 1) {
                    cexPreparacion = objOrigen.getCexPreparacionList().get(0);
                    cexPreparacion.setCprObservaciones(cexPreparacion.getCprObservaciones().concat(" ").concat("TURNO REAGENDADO"));
                } else if (objOrigen.getCexPreparacionList().size() > 1) {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Turno tiene mas de una preparacion no es posible duplicar preparacion", "Turno tiene mas de una preparacion no es posible duplicar preparacion"));
                }
                valorDocumento = Integer.toString(objOrigen.getCagSecuencia());
                cexHistoriaClinica = objOrigen.getCexHistoriaClinica();
                estado = objOrigen.getCagEstado();
                objOrigen.setCexHistoriaClinica(null);
                objOrigen.setCagEstadoReagendado(2);
                objOrigen.setCagFechaRegistro(null);
                objOrigen.setCagHoraRegistro(null);
                objOrigen.setCagIdUsuario(user.getUser().getIdUsuario().intValue());
                objOrigen.setCagNombreUsuario(user.getUser().getAdmEmpleado().getNombreFull());
                objOrigen.setCagObservacion(motivoReagendamiento);
                objOrigen.setCagEstado(0);
                objOrigen.setSeleccionado(false);
                hcAdmin.cancelarTurno(objOrigen, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"),
                        objOrigen.getCagId(), cexHistoriaClinica.getChcHistoriaClinica(), valorDocumento);

            }

            //CREAR NUEVO OBJETO
            objDestino.setCagEstado(estado);
            objDestino.setCagEstadoReagendado(1);
            objDestino.setCagFechaRegistro(admin.getFechaDb());
            objDestino.setCagHoraRegistro(admin.getFechaDb());
            objDestino.setCagIdInstitucion(user.getUser().getAdmEmpleado().getAdmInstitucion().getIdInstitucion());
            objDestino.setCagNombreInstitucion(user.getUser().getAdmEmpleado().getAdmInstitucion().getNombre());
            objDestino.setCagIdUsuario(user.getUser().getIdUsuario().intValue());
            objDestino.setCagNombreUsuario(user.getUser().getAdmEmpleado().getAdmInstitucion().getNombre());
            objDestino.setCexHistoriaClinica(objOrigen.getCexHistoriaClinica() != null ? objOrigen.getCexHistoriaClinica() : cexHistoriaClinica);
            objDestino.setCagObservacion(motivoReagendamiento);
            hcAdmin.reagendarTurno(objDestino, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_INFO, "Historia Clínica " + objDestino.getCexHistoriaClinica().getChcHistoriaClinica() + " perteneciente al paciente " + objDestino.getCexHistoriaClinica().getChcNombreFull(), "Reasignado correctamente"));

            //Reagendar preparacion en el caso de tener ya hecha la preparacion
            if (cexPreparacion.getCprId() != null) {
                cexPreparacion.setCexAgenda(objDestino);
                admin.modificar(cexPreparacion, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
            }
            buscarTurnoOrigenListener();
            buscarTurnoDestinoListener();
        } catch (Exception e) {
            log.error("grabarAction() {} ", e.getMessage());

        }

        return null;

    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    public List<SelectItem> getSelectedItemEspe() {
        try {
            //listaHorarioDia = new ArrayList<CexTurnosDet>();
            //detalle.setCexMedico(null);
            List<SelectItem> items = new ArrayList<>();
            for (CexEspecialidad obj : listEspecialidad) {
                items.add(new SelectItem(obj, obj.getCesNombre()));
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemEspe() {} ", e.getMessage());
        }
        return null;
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    public List<SelectItem> getSelectedItemSubespecialidad() {
        try {
            //listaHorarioDia = new ArrayList<CexTurnosDet>();
            //detalle.setCexMedico(null);
            //List<CexEspecialidad> subespecialidad = adminObject.listarOrdenada(CexEspecialidad.class, "cexEspecialidad", especialidad, "cesEstado", 1, "cesNombre", true);
            List<SelectItem> items = new ArrayList<>();
            for (CexEspecialidad obj : especialidadOrigen.getCexEspecialidadList()) {
                if (obj.getCesEstado().equals(1)) {
                    items.add(new SelectItem(obj, obj.getCesNombre()));
                }
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemSubespecialidad() {} ", e.getMessage());
        }
        return null;
    }

    public List<SelectItem> getSelectedItemMedico() {
        try {
            c1 = Calendar.getInstance();
            c1.setTime(fechaOrigen);
            dia = c1.get(Calendar.DAY_OF_WEEK);
            List<CexEspecialidadMedico> listEspMed = new ArrayList<>();
            // lista los horarios pertenecientes al emdico de acuerdo a la especialidad
            //List<CexHorario> listaHorario1 = adminObject.listarOrdenada(CexHorario.class, "cexEspecialidadMedico.cexEspecialidad", subEspecialidad, "admTipoConsulta", admTipoConsulta, "choId", true);
            // Filtra los horarios segun el dia actual
            List<SelectItem> items = new ArrayList<>();
            for (CexEspecialidadMedico cexEspMed : subEspecialidadOrigen.getCexEspecialidadMedicoList()) {
                for (CexHorario cexHorario : cexEspMed.getCexHorarioList()) {
                    if (cexHorario.getAdmTipoConsulta().equals(admTipoConsulta)) {
                        for (CexHorariosDia cexHorarioDia1 : cexHorario.getCexHorariosDiaList()) {
                            //Validar que sea el dia actual
                            if (cexHorarioDia1.getCexDia().getCdiId().equals(dia)) {
                                if (cexHorarioDia1.getChdHoraInicioAm() != null || cexHorarioDia1.getChdHoraFinAm() != null) {
                                    if (cexHorarioDia1.getCexHorario().getCexEspecialidadMedico().getAdmMedico().getAmeEstado() == 1) {
                                        if (!listEspMed.contains(cexHorarioDia1.getCexHorario().getCexEspecialidadMedico())) {
                                            items.add(new SelectItem(cexHorarioDia1.getCexHorario().getCexEspecialidadMedico(), cexHorarioDia1.getCexHorario().getCexEspecialidadMedico().getAdmMedico().getAmeNombreFull()));
                                            listEspMed.add(cexHorarioDia1.getCexHorario().getCexEspecialidadMedico());
                                        }
                                    }
                                }
                            }
                        }
                    }

                }
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemMedico() {} ", e.getMessage());
        }
        return null;
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    public List<SelectItem> getSelectedItemSubespecialidadDestino() {
        try {
            //listaHorarioDia = new ArrayList<CexTurnosDet>();
            //detalle.setCexMedico(null);
            //List<CexEspecialidad> subespecialidad = adminObject.listarOrdenada(CexEspecialidad.class, "cexEspecialidad", especialidad, "cesEstado", 1, "cesNombre", true);
            List<SelectItem> items = new ArrayList<>();
            for (CexEspecialidad obj : especialidadDestino.getCexEspecialidadList()) {
                if (obj.getCesEstado().equals(1)) {
                    items.add(new SelectItem(obj, obj.getCesNombre()));
                }
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemSubespecialidad() {} ", e.getMessage());
        }
        return null;
    }

    public List<SelectItem> getSelectedItemMedicoDestino() {
        try {
            c1 = Calendar.getInstance();
            c1.setTime(fechaDestino);
            dia = c1.get(Calendar.DAY_OF_WEEK);
            List<CexEspecialidadMedico> listEspMed = new ArrayList<>();
            // lista los horarios pertenecientes al emdico de acuerdo a la especialidad
            //List<CexHorario> listaHorario1 = adminObject.listarOrdenada(CexHorario.class, "cexEspecialidadMedico.cexEspecialidad", subEspecialidad, "admTipoConsulta", admTipoConsulta, "choId", true);
            // Filtra los horarios segun el dia actual
            List<SelectItem> items = new ArrayList<>();
            for (CexEspecialidadMedico cexEspMed : subEspecialidadDestino.getCexEspecialidadMedicoList()) {
                for (CexHorario cexHorario : cexEspMed.getCexHorarioList()) {
                    if (cexHorario.getAdmTipoConsulta().equals(admTipoConsulta)) {
                        for (CexHorariosDia cexHorarioDia1 : cexHorario.getCexHorariosDiaList()) {
                            //Validar que sea el dia actual
                            if (cexHorarioDia1.getCexDia().getCdiId().equals(dia)) {
                                if (cexHorarioDia1.getChdHoraInicioAm() != null || cexHorarioDia1.getChdHoraFinAm() != null) {
                                    if (cexHorarioDia1.getCexHorario().getCexEspecialidadMedico().getAdmMedico().getAmeEstado() == 1) {
                                        if (!listEspMed.contains(cexHorarioDia1.getCexHorario().getCexEspecialidadMedico())) {
                                            items.add(new SelectItem(cexHorarioDia1.getCexHorario().getCexEspecialidadMedico(), cexHorarioDia1.getCexHorario().getCexEspecialidadMedico().getAdmMedico().getAmeNombreFull()));
                                            listEspMed.add(cexHorarioDia1.getCexHorario().getCexEspecialidadMedico());
                                        }
                                    }
                                }
                            }
                        }
                    }

                }
            }
            return items;
        } catch (Exception e) {
            log.error("getSelectedItemMedico() {} ", e.getMessage());
        }
        return null;
    }

    /**
     * Implementa el comportamiento para inicializar los datos del objeto a
     * administrar.
     *
     * @return null, retorna a la página invocada.
     */
    public String limpiarMedico() {
        //detalle.setCexMedico(new CexMedico());
        //especialidad = new CexEspecialidad();
        //subEspecialidad = new CexEspecialidad();
        listaOrigen.clear();
        medicoOrigen = new CexEspecialidadMedico();
        return null;
    }

    /**
     * Implementa el comportamiento para inicializar los datos del objeto a
     * administrar.
     *
     * @return null, retorna a la página invocada.
     */
    public String limpiarMedicoDestino() {
        //detalle.setCexMedico(new CexMedico());
        //especialidad = new CexEspecialidad();
        //subEspecialidad = new CexEspecialidad();
        listaDestino.clear();
        medicoDestino = new CexEspecialidadMedico();
        return null;
    }

    /**
     * Metodo que busca segun la especialidad , el Doctor y el horario que tiene
     * asignado cada doctor el turno mas cerca dispible
     *
     * @author David Carranza
     */
    public void buscarTurnoOrigenListener() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        int contHor = 0;
        listaHorarioDia.clear();
        listaOrigen.clear();
        List<CexAgenda> listTempAgen;
        try {

            //Recupera permiso para saber si se puede agendar en la fecha seleccionada
            List<AdmPermiso> objLicencia = (List<AdmPermiso>) adminObject.queryEJB("select p from AdmPermiso p where :var1 between p.apeFechaInicio and p.apeFechaFin and p.admMedico = :var2", fechaOrigen, medicoOrigen.getAdmMedico());
            //List<CexPermiso> objLicencia = adminObject.ejecutarQueryNativoLista("SELECT * FROM cex_Permiso where med_id = " + object.getCexHorario().getCexEspecialidadMedico().getCexMedico().getMedId() + " and date('" + fecha + "') between per_fecha_inicio and per_fecha_fin;", CexPermiso.class);
            //Verifica si tiene permiso
            if (objLicencia.size() > 0 || !objLicencia.isEmpty()) {
                textoReagendamiento = "AGENDA BLOQUEADA";
                contOrigen = 1;
            } else {
                textoReagendamiento = "AGENDA NO BLOQUEADA";
                contOrigen = 0;
            }
            //Recuper la lista del horario de acuerdo al dia seleciconado
            for (CexHorario objTemH : medicoOrigen.getCexHorarioList()) {
                //Verificar los horarios segun el tipo de consulta de la agenda
                if (objTemH.getAdmTipoConsulta().equals(admTipoConsulta)) {
                    //Recorrer los horarios dias de cada horario
                    for (CexHorariosDia objTemHd : objTemH.getCexHorariosDiaList()) {
                        if (objTemHd.getCexDia().getCdiId().equals(dia)) {
                            //Añadir solo el horario que tenga asignado hora inicio y hora fin
                            if (objTemHd.getChdHoraInicioAm() != null && objTemHd.getChdHoraFinAm() != null) {
                                listaHorarioDia.add(objTemHd);
                            }
                        }
                    }
                }
            }

            //Recuperar las agendas de acuerdo al horarioDia y de acuerdo a las fechas
            for (CexHorariosDia objHorDia : listaHorarioDia) {
                //Asignar numero de horario
                objHorDia.setOrdenHorario(contHor);
                listTempAgen = adminObject.listarOrdenada(CexAgenda.class, "cagFecha", fechaOrigen, "cexHorariosDia", objHorDia, "cagSecuencia", true);
                for (CexAgenda objA : listTempAgen) {
                    objA.setNumeroHorario(contHor);
                    listaOrigen.add(objA);
                }
                listTempAgen.clear();
                contHor++;
            }

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Metodo que busca segun la especialidad , el Doctor y el horario que tiene
     * asignado cada doctor el turno mas cerca dispible
     *
     * @author David Carranza
     */
    public void buscarTurnoDestinoListener() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        int contHor = 0;
        listaHorarioDia.clear();
        listaDestino.clear();
        List<CexAgenda> listTempAgen;
        try {

            //Recupera permiso para saber si se puede agendar en la fecha seleccionada
            //List<AdmPermiso> objLicencia = (List<AdmPermiso>) adminObject.queryEJB("select p from AdmPermiso p where :var1 between p.apeFechaInicio and p.apeFechaFin and p.admMedico = :var2", fechaAgenda, object.getAdmMedico());
            //List<CexPermiso> objLicencia = adminObject.ejecutarQueryNativoLista("SELECT * FROM cex_Permiso where med_id = " + object.getCexHorario().getCexEspecialidadMedico().getCexMedico().getMedId() + " and date('" + fecha + "') between per_fecha_inicio and per_fecha_fin;", CexPermiso.class);
            //Verifica si tiene permiso
//            if (objLicencia.size() < 0 || objLicencia.isEmpty()) {
            //Recuper la lista del horario de acuerdo al dia seleciconado
            for (CexHorario objTemH : medicoDestino.getCexHorarioList()) {
                //Verificar los horarios segun el tipo de consulta de la agenda
                if (objTemH.getAdmTipoConsulta().equals(admTipoConsulta)) {
                    //Recorrer los horarios dias de cada horario
                    for (CexHorariosDia objTemHd : objTemH.getCexHorariosDiaList()) {
                        if (objTemHd.getCexDia().getCdiId().equals(dia)) {
                            //Añadir solo el horario que tenga asignado hora inicio y hora fin
                            if (objTemHd.getChdHoraInicioAm() != null && objTemHd.getChdHoraFinAm() != null) {
                                listaHorarioDia.add(objTemHd);
                            }
                        }
                    }
                }
            }

            //Recuperar las agendas de acuerdo al horarioDia y de acuerdo a las fechas
            for (CexHorariosDia objHorDia : listaHorarioDia) {
                //Asignar numero de horario
                objHorDia.setOrdenHorario(contHor);
                listTempAgen = adminObject.listarOrdenada(CexAgenda.class, "cagFecha", fechaDestino, "cexHorariosDia", objHorDia, "cagSecuencia", true);
                for (CexAgenda objA : listTempAgen) {
                    objA.setNumeroHorario(contHor);
                    listaDestino.add(objA);
                }
                listTempAgen.clear();
                contHor++;
            }

        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    public void onRowEdit(RowEditEvent event) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        try {
            CexAgenda objAgen = (CexAgenda) event.getObject();
            adminObject.modificar(objAgen, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    public void onRowCancel(RowEditEvent event) {
        FacesMessage msg = new FacesMessage("Edit Cancelled", ((CexAgenda) event.getObject()).getCagObservacion());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    @Override
    public List<SelectItem> getSelectedItem() {
//        try {
//            List<CexTurnosEnc> datos = admin.listarOrdenada(object.getClass(), "nombre", true);
//            List<SelectItem> items = new ArrayList<SelectItem>();
//            for (CexTurnosEnc obj : datos) {
//                items.add(new SelectItem(obj, obj.get));
//            }
//            return items;
//        } catch (Exception e) {
//            log.error("getSelectedItem() {} ", e.getMessage());
//        }
        return null;
    }

    @Override
    public DataModel<CexEspecialidadMedico> getDataModel() {
        return null;
    }

    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }

    public Date getFechaOrigen() {
        return fechaOrigen;
    }

    public void setFechaOrigen(Date fechaOrigen) {
        this.fechaOrigen = fechaOrigen;
    }

    public Date getFechaDestino() {
        return fechaDestino;
    }

    public void setFechaDestino(Date fechaDestino) {
        this.fechaDestino = fechaDestino;
    }

    public CexEspecialidad getEspecialidadOrigen() {
        return especialidadOrigen;
    }

    public void setEspecialidadOrigen(CexEspecialidad especialidadOrigen) {
        this.especialidadOrigen = especialidadOrigen;
    }

    public CexEspecialidad getSubEspecialidadOrigen() {
        return subEspecialidadOrigen;
    }

    public void setSubEspecialidadOrigen(CexEspecialidad subEspecialidadOrigen) {
        this.subEspecialidadOrigen = subEspecialidadOrigen;
    }

    public CexEspecialidad getEspecialidadDestino() {
        return especialidadDestino;
    }

    public void setEspecialidadDestino(CexEspecialidad especialidadDestino) {
        this.especialidadDestino = especialidadDestino;
    }

    public CexEspecialidad getSubEspecialidadDestino() {
        return subEspecialidadDestino;
    }

    public void setSubEspecialidadDestino(CexEspecialidad subEspecialidadDestino) {
        this.subEspecialidadDestino = subEspecialidadDestino;
    }

    public CexEspecialidadMedico getMedicoOrigen() {
        return medicoOrigen;
    }

    public void setMedicoOrigen(CexEspecialidadMedico medicoOrigen) {
        this.medicoOrigen = medicoOrigen;
    }

    public CexEspecialidadMedico getMedicoDestino() {
        return medicoDestino;
    }

    public void setMedicoDestino(CexEspecialidadMedico medicoDestino) {
        this.medicoDestino = medicoDestino;
    }

    public List<CexAgenda> getListaOrigen() {
        return listaOrigen;
    }

    public void setListaOrigen(List<CexAgenda> listaOrigen) {
        this.listaOrigen = listaOrigen;
    }

    public List<CexAgenda> getListaDestino() {
        return listaDestino;
    }

    public void setListaDestino(List<CexAgenda> listaDestino) {
        this.listaDestino = listaDestino;
    }

    public String getMotivoReagendamiento() {
        return motivoReagendamiento;
    }

    public void setMotivoReagendamiento(String motivoReagendamiento) {
        this.motivoReagendamiento = motivoReagendamiento;
    }

    public AdmUsuario getAdmUsuario() {
        return admUsuario;
    }

    public void setAdmUsuario(AdmUsuario admUsuario) {
        this.admUsuario = admUsuario;
    }

    public String getTextoReagendamiento() {
        return textoReagendamiento;
    }

    public void setTextoReagendamiento(String textoReagendamiento) {
        this.textoReagendamiento = textoReagendamiento;
    }

}
